package com.cskaoyan.javase.oop3._2inner._0introduction;

/**
 * 内部类的引入
 * 引例:
 * 我们现在做一个应用程序，需要描述一台电脑中的CPU，对于电脑而言，该怎么去描述这个CPU呢？
 *
 * 我们可以定义一个Computer类,电脑类具有一些属性和行为
 * 再定义一个CPU类,它也有一些属性和行为
 * 这样定义完毕后,我们可以让Computer类持有CPU对象的引用,并且可以私有化这个成员变量
 * 这样,就大致描述了它们的关系,但是还是有一些问题的:
 *      1.CPU很重要且强大,但是脱离计算机是没有意义的 ---> CPU对象不应该在Computer类外出现
 *      2.CPU是计算机中的控制核心,能够操作计算机的一切硬件资源 --> CPU对象应该能够访问Computer类的所有成员,不论私有
 * 以上两点,我们定义两个独立类的做法,是没有办法完成的.
 *      那么这时,就不应该定义独立存在的类了,而是内部类:
 *      1.定义在成员位置的内部类具有私有的概念,这样它在外部就无法创建对象了
 *      2.定义在成员位置的内部类,近似可以看成该类的成员,那么-->
 *          内部类和装着内部类的类,成为了"好兄弟",它们之间的访问不受访问权限限制.
 *
 * 总结一下,我们使用(定义在成员位置的)内部类,有两个好处:
 *      1.绝对封装,用一个类去隐藏另一个类,是更极致的封装思想体现.更加安全
 *      2.内部类和装着它的类互相之间的访问,不受访问权限限制.
 *
 *
 * 在Java语言中类可以嵌套定义，广义的内部类指的是定义在另一类当中的一个类。
 * 当然内部类有很多，如果按照内部类在类中定义的位置不同，可以分为：
 * 1. 定义在成员位置的内部类，包括成员内部类，静态内部类。
 * 2. 定义在局部位置的内部类，包括局部内部类，匿名内部类，Lambda表达式。
 *
 * 但是我们在学习的时候，不按定义位置来学习。我们按照它是一个类，还是一个对象来分类：
 * 1. 语法定义了一个类，包括成员内部类、静态内部类和局部内部类。既然是定义了一个类，使用时还需要创建对象才能用。
 * 2. 语法直接创建了一个对象，包括匿名内部类和Lambda表达式。由于已经通过语法创建了对象，可以直接使用。
 *
 *
 * 为了上课方便，我们需要统一口径，在内部类课程当中，我们统一规定：
 * 1. 像CPU这种，定义在别的类的内部的类，我们称之为内部类。（inner）
 * 2. 像Computer这种，包裹内部类的，我们称之为外围类。（enclosed）
 * 3. Demo这种类我们称之为外部类/其他类。（outside）
 *
 *
 * @since 09:44
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 私有的内部类,无法在外界创建对象
        // CPU c = new CPU();
    }
}

class Computer {
    private int a;
    private int b;
    private CPU c = new CPU();

    private class CPU {

    }
}

// class CPU {
//
// }